package com.github.springboot.controller;

import com.github.springboot.common.Response;
import com.github.springboot.entity.User;
import com.github.springboot.service.UserService;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

/**
 * Created by kjtang on 2018/1/17.
 */
@Api("用户操作相关API")
@RestController
@RequestMapping("/api/user")
public class UserController {

    @Autowired
    private UserService userService;

    @ApiOperation(value = "新增用户信息",notes = "新增用户信息",httpMethod = "POST")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query")
    })
    @ApiResponses({
            @ApiResponse(code=200,message = "新增用户成功"),
            @ApiResponse(code=500,message = "新增用户失败")
    })
    @RequestMapping("/add")//@Validated是@Valid 的一次封装，是Spring提供的校验机制使用。@Valid不提供分组功能
    public Response<User> addUser(@RequestBody @Validated User user) throws Exception{
        Response<User> resp = new Response<User>(Response.SUCCESS);
        userService.addUser(user);
        return resp;
    }

    @ApiOperation(value = "通过ID查询用户信息",notes = "通过ID查询用户信息",httpMethod = "GET")
    @ApiResponses({
            @ApiResponse(code=200,message = "查询用户信息成功"),
            @ApiResponse(code=500,message = "查询用户信息失败")
    })
    @RequestMapping(value="/get/{id}",method=RequestMethod.GET)
    public Response<User> getUserById(@PathVariable("id") Long id) throws Exception{
        Response<User> resp = new Response<User>(Response.SUCCESS);
        User user = userService.getUserById(id);
        resp.setData(user);
        return resp;
    }

    @ApiOperation(value = "查询用户信息",notes = "查询通话信息",httpMethod = "POST")
    @ApiResponses({
            @ApiResponse(code=200,message = "查询用户信息成功"),
            @ApiResponse(code=500,message = "查询用户信息失败")
    })
    @RequestMapping(value="/getUserList",method = RequestMethod.POST)
    public Response<User> getUserList(@RequestBody @Valid User user) throws Exception{
        Response<User> resp = new Response<User>(Response.SUCCESS);
        return resp;
    }

    /**
     * Swagger总结如下
     *  @Api：用在类上，说明该类的作用
         @ApiOperation：用在方法上，说明方法的作用
         @ApiImplicitParams：用在方法上包含一组参数说明
         @ApiImplicitParam：用在@ApiImplicitParams注解中，指定一个请求参数的各个方面
         paramType：参数放在哪个地方
         header-->请求参数的获取：@RequestHeader
         query-->请求参数的获取：@RequestParam
         path（用于restful接口）-->请求参数的获取：@PathVariable
         body（不常用）
         form（不常用）
         name：参数名
         dataType：参数类型
         required：参数是否必须传
         value：参数的意思
         defaultValue：参数的默认值
         @ApiResponses：用于表示一组响应
         @ApiResponse：用在@ApiResponses中，一般用于表达一个错误的响应信息
         code：数字，例如400
         message：信息，例如"请求参数没填好"
         response：抛出异常的类
         @ApiModel：描述一个Model的信息（这种一般用在post创建的时候，使用@RequestBody这样的场景，请求参数无法使用@ApiImplicitParam注解进行描述的时候）
         @ApiModelProperty：描述一个model的属性
     *
     */
}
